package com.tyj.gulimall.search.thread;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadTest {
    //创建一个线程池
    public static ExecutorService executorService=Executors.newFixedThreadPool(10);

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        System.out.println("main_start...");

        //使用异步线程执行业务
//        CompletableFuture.runAsync(()->{
//            for (int i = 0; i <10000 ; i++) {
//                System.out.println("异步执行业务中1");
//            }
//        },executorService);

        //带返回值的异步
//        CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
//            for (int i = 0; i <10000 ; i++) {
//                System.out.println("异步执行业务中2");
//            }
//            int i = 10 / 0;
//            return i;
//        }, executorService)
//                //方法执行完成后的处理
//                .handle((res,thr)->{
//                    if (thr==null){
//                        return res;
//                    }else {
//                        return 0;
//                    }
//
//                });
                    //方法执行完成后的感知
//                .whenComplete((res,exception)->{ //whenComplete成功回调函数
//                    System.out.println("异步任务成功完成...结果是="+res+"异常是="+exception);
//                }).exceptionally((throwable)->{
//                    //感知异常返回默认值
//                    return 10;
//                });

        //线程串行化
//        CompletableFuture.supplyAsync().thenApplyAsync().thenAcceptAsync().thenRunAsync();

        //线程组合
//        CompletableFuture<Object> future1 = CompletableFuture.supplyAsync(() -> {
//            System.out.println("任务1开始");
//            int i = 10 / 4;
//            System.out.println("任务1结束");
//            return i;
//        }, executorService);
//
//        CompletableFuture<Object> future2 = CompletableFuture.supplyAsync(() -> {
//            System.out.println("任务2开始");
//            System.out.println("任务2结束");
//            return "Hello";
//        }, executorService);

        //不能感知返回值  runAfterBothAsync
//        future1.runAfterBothAsync(future2,()->{
//            System.out.println("任务3开始");
//        });
        //能接受返回值
//        future1.thenAcceptBothAsync(future2,(f1,f2)->{
//            System.out.println("任务3开始,之前的结果为:"+f1+"-->"+f2);
//        },executorService);
        //能接受参数能返回
//        CompletableFuture<String> stringCompletableFuture = future1.thenCombineAsync(future2, (f1, f2) -> {
//            System.out.println("任务3开始,之前的结果为:" + f1 + "-->" + f2);
//            return f1 + f2;
//        }, executorService);
        //        String s = stringCompletableFuture.get();


        //runAfterEitherAsync()两个任务有一个完成就执行 不感知结果,无返回值
//        future1.runAfterEitherAsync(future2,()->{
//            System.out.println("任务3开始");
//        },executorService);
        //acceptEitherAsync不感知结果,无返回值
//        future1.acceptEitherAsync(future2,(res)->{
//            System.out.println("任务3开始 结果="+res);
//        },executorService);
        //applyToEitherAsync 感知结果 有返回值

//        CompletableFuture<String> stringCompletableFuture = future1.applyToEitherAsync(future2, (res) -> {
////            System.out.println("任务3开始 结果=" + res);
////            return res.toString();
////        }, executorService);
//        String s = stringCompletableFuture.get();


        //多任务组合
        CompletableFuture<String> futrueImg = CompletableFuture.supplyAsync(() -> {
            System.out.println("查询商品的图片信息");
            return "hello.jpg";
        },executorService);
        CompletableFuture<String> futrueAttr = CompletableFuture.supplyAsync(() -> {
            System.out.println("查询商品的属性");
            return "黑色+256G";
        },executorService);
        CompletableFuture<String> futrueDesc = CompletableFuture.supplyAsync(() -> {
            System.out.println("查询商品的介绍");
            return "华为";
        },executorService);

        //等上面3个任务都做完就会执行下面代码
//        CompletableFuture<Void> allof = CompletableFuture.allOf(futrueImg, futrueAttr, futrueDesc);
//        allof.get();
        //三个之中一个完成就会执行下面代码
        CompletableFuture<Object> anyOf = CompletableFuture.anyOf(futrueImg, futrueAttr, futrueDesc);



        //获得异步运行结果  这时已经发生阻 integerCompletableFuture.get();(阻塞方法)
//        Integer integer = future.get();
//        System.out.println("运行结果="+integer);

        System.out.println("main_end...");
    }
}
